package cn.bellychang.leetcode.question239;

import java.util.ArrayDeque;
import java.util.Deque;

/**
 * @author ChangLiang
 * @date 2021/3/17
 */
public class Solution2 {

    public int[] maxSlidingWindow(int[] nums, int k) {

        int[] result = new int[nums.length - k + 1];

        Deque<Integer> deque = new ArrayDeque<>(k);

        for (int i = 0; i < nums.length; i++) {
            while (deque.size() != 0 && nums[deque.peekLast()] < nums[i]) {
                deque.removeLast();
            }
            deque.addLast(i);

            // 关键  头部如何根据滑动窗口减去元素 并 放到result中

            // 比如queue中的1 何时移除呢？  当4进入到队列中
            if (deque.peekFirst() == i - k) {
                deque.removeFirst();
            }

            // 当 i 大于等于2 就开始输出
            if (i >= k - 1) {
                result[i - k + 1] = nums[deque.peekFirst()];
            }

        }

        return result;
    }
}
